package cn.hill4j.tool.spring.ext.dispatcher;

import cn.hill4j.tool.spring.ext.dispatcher.exception.DispatchInvokerException;

import java.lang.reflect.Method;
import java.lang.reflect.Type;

/**
 * 分发执行处理器
 *
 * @author: hillchen
 * Date: 2023-02-17 13:43
 */
public class DsMethodHandler {
    /**
     * 业务处理bean
     */
    private Object invokerBean;
    /**
     * 请求参数类型
     */
    private Type[] paramClass;
    /**
     * 业务处理具体方法
     */
    private Method invokerMethod;
    /**
     * 分发处理器分组
     */
    private String groupName;
    /**
     * 分发处理器业务类型
     */
    private String bizName;
    /**
     * @author hillchen
     * Description: 分发执行处理器构造器
     * Date 2023/8/8 23:52
     * @param invokerBean 业务处理bean
     * @param paramClass 请求参数类型
     * @param invokerMethod 业务处理具体方法
     * @param groupName 分发处理器分组
     * @param bizName 分发处理器业务类型
     *
     **/
    public DsMethodHandler(Object invokerBean, Type[] paramClass, Method invokerMethod, String groupName, String bizName) {
        this.invokerBean = invokerBean;
        this.paramClass = paramClass;
        this.invokerMethod = invokerMethod;
        this.groupName = groupName;
        this.bizName = bizName;
    }
    /**
     * @author hillchen
     * Description: 执行具体分发业务逻辑
     * Date 2023/8/8 23:52
     * @param args 请求参数
     * @return  Object
     * @throws DispatchInvokerException 分发异常
     **/
    public Object invoke(Object[] args) throws DispatchInvokerException {
        try {
            return invokerMethod.invoke(invokerBean,args);
        }catch (Exception e){
            throw new DispatchInvokerException(String.format("执行分发处理[groupName:%s,bizName:%s]方式失败",groupName,bizName),e);
        }
    }
    /**
     * @author hillchen
     * Description: 获取请求参数类型
     * Date 2023/8/8 23:52
     * @return Type[]
     **/
    public Type[] getParamClass() {
        return paramClass;
    }
}
